package com.itheima.controller;

import com.itheima.pojo.Dept;
import com.itheima.pojo.Result;
import com.itheima.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Iterator;
import java.util.List;

/**
 * 部门管理Controller
 */

    /*
    开发规范-Restful

    REST（REpresentational State Transfer），表述性状态转换，它是一种软件架构风格,简洁、规范、优雅

    传统风格
    http://localhost:8080/user/getById?id=1     GET：查询id为1的用户
    http://localhost:8080/user/saveUser         POST：新增用户
    http://localhost:8080/user/updateUser       POST：修改用户
    http://localhost:8080/user/deleteUser?id=1  GET：删除id为1的用户

    REST风格
    http://localhost:8080/users/1  GET：查询id为1的用户
    http://localhost:8080/users    POST：新增用户
    http://localhost:8080/users    PUT：修改用户
    http://localhost:8080/users/1  DELETE：删除id为1的用户

    特点:
    1.通过URL定位资源
    2.通过HTTP请求动词描述操作

    注意:
    1.REST是风格，是约定方式，约定不是规定，可以打破。
    2.描述模块的功能通常使用复数，也就是加s的格式来描述，表示此类资源，而非单个资源。如：users、emps、books…
     */


    /*
    开发规范-统一响应结果

    定义Result实体类将其JSON字符串来作为前后端交互统一的响应结果

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Result {
        private Integer code;//响应码，1 代表成功; 0 代表失败
        private String msg;  //响应信息 描述字符串
        private Object data; //返回的数据

        //增删改 成功响应
        public static Result success(){
            return new Result(1,"success",null);
        }
        //查询 成功响应
        public static Result success(Object data){
            return new Result(1,"success",data);
        }
        //失败响应
        public static Result error(String msg){
            return new Result(0,msg,null);
        }
    }
    */


@Slf4j /*使得类中可以用log打印日志信息*/
@RestController
@RequestMapping("/depts") //类路径,公共请求路径,一个完整的请求路径，应该是类上的 @RequestMapping 的value属性 + 方法上的 @XXXMapping的value属性。
public class DeptController {

    @Autowired
    private DeptService deptService;

    @GetMapping
    public Result list() {

        System.out.println("DeptController#list运行啦");
        log.info("DeptController#list运行啦");

        try {
            //所有部门数据
            List<Dept> list = deptService.list();
            //返回结果
//            Result result = new Result();
//            result.setCode(1);
//            result.setData(list);
//            result.setMsg("success");
//            return result;
            return Result.success(list);
        } catch (Exception e) {
//            Result result = new Result();
//            result.setCode(0);
//            result.setMsg("失败，原因可能为："+e.getMessage());
//            return result;
            return Result.error("失败，原因可能为：" + e.getMessage());
        }
    }

    //@RequestMapping(value = "/depts/{id}",method = RequestMethod.DELETE)
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {

        deptService.delete(id);
        return Result.success();
    }


    @PostMapping
    public Result insert(@RequestBody Dept dept) {

        log.info("接收到的post请求当中的JSON部门数据:{}", dept);
        System.err.println("接收到的post请求当中的JSON部门数据:" + dept);

        deptService.insert(dept);
        return Result.success();
    }


    /*
    编辑部门数据功能
    页面中点击编辑,发起PUT请求,请求中有id参数,根据id查出该部门全部信息,并返回
    页面中编辑完成新的数据后,发起POST请求,请求中有修改后的那个部门的JSON数据,直接修改数据库中对应数据即可
     */

    /**
     * 偷懒实现:
     * 通过查询全部数据,再手动遍历查找指定id
     */
    @RequestMapping(value = "selectById1/{id}", method = RequestMethod.PUT)
    public Result selectById1(@PathVariable Integer id) {
        List<Dept> list = deptService.list();//先拿到全部部门信息
        //再通过遍历,找到id对应的那一个Dept对象
        Iterator<Dept> iterator = list.iterator();
        while (iterator.hasNext()) {
            Dept next = iterator.next();
            Integer id1 = next.getId();
            if (id1.equals(id)) {
                return Result.success(next);
            }
        }
        return Result.error("不存在id=" + id + "的部门!");
    }


    /**
     * 常规实现:
     * 通过指定id查找单条数据
     */
    @PutMapping("selectById2/{id}")
    public Result selectById2(@PathVariable Integer id) {
        Dept result = deptService.listById(id);
        if (result == null) {
            return Result.error("不存在id=" + id + "的部门!");
        }
        return Result.success(result);
    }

    /*
    编辑部门数据功能
    页面中点击编辑,发起PUT请求,请求中有id参数,根据id查出该部门全部信息,并返回
    页面中编辑完成新的数据后,发起POST请求,请求中有修改后的那个部门的JSON数据,直接修改数据库中对应数据即可
     */
    @PostMapping("updateById")
    public Result updateById(@RequestBody Dept dept) {
        deptService.updateById(dept);
        return Result.success();
    }


}
